<?php

declare(strict_types=1);


namespace app\api\controller;

use app\api\controller\Base;
use app\common\model\Goods as Goodsmodel;
use app\common\model\GoodsLock;
use app\common\model\GoodsList;
use app\common\model\Collect;
use app\common\model\Shang;
use app\common\model\User;
use app\common\model\Order;
use app\common\model\OrderList;
use app\common\model\UserVip;
use app\common\model\Coupon as CouponModel;

use app\common\model\ConvertCode;
use app\common\model\ConvertCodeReceive;
use think\facade\Db;
use \think\Request;
use app\common\model\CouponReceive as CouponReceiveModel;

class Goods extends Base
{

    static $page_size = 10;
    static $shang_prize_id = [10, 33]; #抽奖赏品id
    static $shang_count_id = [10, 38]; #统计次数
    //    static $shang_give_arr = [
    //        1 => '上半场随机获得',
    //        2 => '下半场随机获得',
    //        3 => '最后一发获得',
    //        4 => '全场随机获得',
    //        5 => '获取指定数量全局赏获得',
    //    ];#赠送(FIRST赏 LAST赏 最终赏 全局赏 拳王赏)赏品id
    static $shang_give_arr = [
        1 => '只赠不售',
        2 => '只赠不售',
        3 => '只赠不售',
        4 => '只赠不售',
        5 => '只赠不售',
    ]; #赠送(FIRST赏 LAST赏 最终赏 全局赏 拳王赏)赏品id

    /**
     * 首页盒子列表
     * @param Request $request
     * @param [type]    类型 (14)推荐 (1)一番赏 (2)积分赏 (3)擂台赏
     * @return \think\response\Json
     * @throws \think\db\exception\DbException
     * created by Admin at 2022/12/7 15:49
     */
    public function goods(Request $request)
    {
        $user = $this->getUser(false);

        $whe = [];
        $whe[] = ['status', '=', 1];
        $whe[] = ['show_is', '=', 0];

        $type_str = request()->param('type', -1);
        //        1一番赏 2无限赏 3擂台赏 4抽卡机 5积分赏 6全局赏 7福利盲盒  8领主赏  9连击赏
        if ($type_str == 1) {
            $whe[] = ['type', '=', 1];
        } elseif ($type_str == 2) {
            $whe[] = ['type', '=', 2];
        } elseif ($type_str == 3) {
            $whe[] = ['type', '=', 3];
        } elseif ($type_str == 5) {
            $whe[] = ['type', '=', 5];
        } elseif ($type_str == 6) {
            $whe[] = ['type', '=', 6];
        } elseif ($type_str == 7) {
            $whe[] = ['type', '=', 7];
        } elseif ($type_str == 8) {
            $whe[] = ['type', '=', 8];
        } elseif ($type_str == 9) {
            $whe[] = ['type', '=', 9];
        } else {
            $whe[] = ['type', 'not in', [4, 2]];
        }
        $whee = [];
        $whee[] = ['order_type', '=', 1];
        if (!empty($user)) {
            $whee[] = ['user_id', '=', $user['id']];
        }
        // $check_order = OrderList::where($whee)->find();
        // if (empty($check_order) ||  $user == false) {
        //     $limit = 1;
        //     if ($type_str !=  1) {
        //         $new_data = [
        //             'data' => [],
        //             'last_page' => 0,
        //         ];
        //         return $this->renderSuccess('请求成功', $new_data);
        //     }
        // } else {
        //     $limit = 15;
        // }
        $limit = 15;
        #盒子
        $goods = GoodsModel::where($whe)
            ->field("id,title,imgurl,price,type,stock,sale_stock,status,lock_is,is_shou_zhe,pay_mode")
            ->order("sort desc,id desc")->paginate($limit)->each(function ($itme) {
                $itme['imgurl'] = imageUrl($itme['imgurl']);
                #剩余
                $itme['sale_stock'] = $itme['stock'] - $itme['sale_stock'];

                #参与次数
                $join_count = OrderList::field('id')
                    ->where('shang_id', 'between', self::$shang_count_id)
                    ->where('goods_id', '=', $itme['id'])
                    ->where('order_type', '=', $itme['type'])
                    ->count();
                $itme['join_count'] = $join_count;
                $itme['need_draw_num'] = 0;
                if ($itme['type'] == 7) {
                    $itme['need_draw_num'] = 1;
                }
                $type_text = '';
                if ($itme['type'] == 1) {
                    $type_text = '一番赏';
                } elseif ($itme['type'] == 2) {
                    $type_text = '无限赏';
                } elseif ($itme['type'] == 3) {
                    $type_text = '擂台赏';
                } elseif ($itme['type'] == 5) {
                    $type_text = '积分赏';
                } elseif ($itme['type'] == 6) {
                    $type_text = '全局赏';
                } elseif ($itme['type'] == 8) {
                    $type_text = '领主赏';
                } elseif ($itme['type'] == 9) {
                    $type_text = '连击赏';
                }
                $itme['type_text'] = $type_text;
            });
        $new_data = [
            'data' => $goods->items(),
            'last_page' => $goods->lastPage(),
        ];
        return $this->renderSuccess('请求成功', $new_data);
    }


    /**
     * 商品详情
     * @param $goods_id 盒子id
     * @param $goods_num 盒子箱号
     */
    public function goodsdetail()
    {
        $user_info = $this->getUser();

        $goods_id = request()->param('goods_id/d', 0);
        $goods_num = request()->param('goods_num/d', 0);
        $goods = Goodsmodel::field('id,title,imgurl_detail,price,stock,sale_stock,lock_is,type,status,sale_time,is_shou_zhe,pay_mode')
            ->where(['id' => $goods_id])
            ->find();
        if (!$goods) {
            return $this->renderError("盒子不存在");
        }
        if ($goods['status'] != 1 && $goods['status'] != 3) {
            return $this->renderError("盒子已下架");
        }
        if (($goods_num > $goods['stock']) || ($goods_num < 0)) {
            return $this->renderError("箱号错误");
        }
        if ($goods['sale_time']) {
            $goods['addtime'] = date('m-d', $goods['sale_time']);
        } else {
            $goods['addtime'] = '';
        }
        $goods['imgurl_detail'] = imageUrl($goods['imgurl_detail']);
        #自动找箱号
        if ($goods_num == 0) {
            #奖品信息
            $goodslist_info = GoodsList::field('num,sum(`surplus_stock`) as all_surplus_stock')
                ->where(['goods_id' => $goods_id])
                ->where('shang_id', 'not in', [1, 2, 3, 4, 5, 6])
                ->having('all_surplus_stock', '>', 0)
                ->group('num')
                ->order('shang_id asc, num asc')
                ->find();
            if ($goodslist_info) {
                $goods_num = $goodslist_info['num'];
            } else {
                $goods_num = 1;
            }
        }
        $goods['num'] = $goods_num;
        #是否收藏
        $collection_is = Collect::field('id')
            ->where(['user_id' => $user_info['id']])
            ->where(['goods_id' => $goods_id])
            ->where(['num' => $goods_num])
            ->find();
        $goods['collection_is'] = $collection_is ? 1 : 0;
        #本箱子余量
        $goods_surplus = GoodsList::field('sum(`stock`) as stock, sum(`surplus_stock`) as surplus_stock')
            ->where('goods_id', '=', $goods_id)
            ->where('num', '=', $goods_num)
            ->where('shang_id', 'between', self::$shang_prize_id)
            ->find();
        $all_surplus_stock = $goods_surplus['surplus_stock'];
        $all_surplus_stock = $goods_surplus['stock'];

        $goods['surplus_stock'] = $goods['stock'] - $goods['sale_stock'];
        $goods['goodslist_stock'] = $goods_surplus['stock'];
        $goods['goodslist_surplus_stock'] = $goods_surplus['surplus_stock'];
        #概率不足时
        $pro_all = 0;
        $pro_max = 0;
        $pro_key = 0;
        #所有奖品信息
        $goodslist = GoodsList::field('id,shang_id,title,stock,surplus_stock,imgurl,goods_type,sale_time,price,sc_money')
            ->append(['shang_title'])
            ->where(['goods_id' => $goods_id])
            ->where(['num' => $goods_num])
            ->order('shang_id asc, money desc, sort desc,id asc')
            ->select()->toArray();
        foreach ($goodslist as $key => &$value) {
            #价格
            $value['price'] = $value['price'] * 1;
            #预售时间
            if ($value['sale_time']) {
                $value['sale_time'] = date('Y-m-d', $value['sale_time']);
            }
            #剩余
            $surplus_stock = $value['surplus_stock'];
            if (array_key_exists($value['shang_id'], self::$shang_give_arr)) {
                #概率
                $pro = self::$shang_give_arr[$value['shang_id']];
                $pro_num = 0;
            } else {
                #概率
                if ($surplus_stock > 0) {
                    $pro_basics = bcdiv("$surplus_stock", "$all_surplus_stock", 4);
                    $pro = '概率：' . ($pro_basics * 100) . '%';
                    $pro_num = ($pro_basics * 100);
                } else {
                    $pro = '概率：' . 0 . '%';
                    $pro_num = 0;
                }
            }
            $value['surplus_stock'] = $surplus_stock;
            $value['pro'] = $pro;
            $value['imgurl'] = imageUrl($value['imgurl']);
            #计算剩余概率
            $pro_all += $pro_num;
            if ($pro_num >= $pro_max) {
                $pro_max = $pro_num;
                $pro_key = $key;
            }
        }
        #概率不足时
        if ($pro_max > 0 && $pro_all < 100) {
            $surplus_pro = bcsub("100", "$pro_all", 2);
            $goodslist[$pro_key]['pro'] = bcadd("$pro_max", "$surplus_pro", 2) . '%';
        }
        #锁箱信息===============
        $goods_lock_user_nickname = 0;
        $goods_lock_user_headimg = 0;
        $goods_lock_surplus_time = 0;
        $goods_id_num = $goods_id . '_' . $goods_num;
        $goods_lock_info = GoodsLock::where(['goods_id_num' => $goods_id_num])
            ->where('endtime', '>', time())
            ->order('id desc')
            ->find();
        if ($goods['lock_is'] && $goods_lock_info) {
            $goods_lock_surplus_time = $goods_lock_info['endtime'];
            $user_info = User::field('nickname,headimg')->where(['id' => $goods_lock_info['user_id']])->find();
            $goods_lock_user_nickname = $user_info['nickname'];
            $goods_lock_user_headimg = $user_info['headimg'];
        }
        $lock_info = [
            'lock_is' => $goods['lock_is'],
            'goods_lock_user_nickname' => $goods_lock_user_nickname,
            'goods_lock_user_headimg' => $goods_lock_user_headimg,
            'goods_lock_surplus_time' => $goods_lock_surplus_time,
        ];
        #锁箱信息===============

        #参与人数
        $join_user = OrderList::field('user_id')
            ->append(['userinfo'])
            ->where('goods_id', '=', $goods_id)
            ->where('num', '=', $goods_num)
            ->where('shang_id', 'between', self::$shang_count_id)
            ->where('order_type', '=', $goods['type'])
            ->order('id desc')
            ->group('user_id')
            ->limit(5)
            ->select();
        $new_join_user = [];
        foreach ($join_user as $join_user_value) {
            $new_join_user[] = $join_user_value['userinfo']['headimg'];
        }
        #参与次数
        $join_count = OrderList::field('id')->where('goods_id', '=', $goods_id)
            ->where('num', '=', $goods_num)
            ->where('shang_id', 'between', self::$shang_count_id)
            ->where('order_type', '=', $goods['type'])
            ->count();
        #时间配置
        $config = getConfig('base');
        $goods['three_time'] = $config['three_time'];
        $goods['five_time'] = $config['five_time'];
        $new_data = [
            'goods' => $goods,
            'lock_info' => $lock_info,
            'join_user' => $new_join_user,
            'join_count' => $join_count,
            'goodslist' => $goodslist,
        ];
        return $this->renderSuccess("请求成功", $new_data);
    }

    /**
     * 换箱箱号
     */
    public function goodslist_count()
    {
        $goods_id = request()->param('goods_id/d', 0);
        #盒子信息
        $goods = Goodsmodel::field('id,stock,status')
            ->where(['id' => $goods_id])
            ->find();
        if (!$goods) {
            return $this->renderError("盒子不存在");
        }
        if ($goods['status'] != 1 && $goods['status'] != 3) {
            return $this->renderError("盒子已下架");
        }
        $page_size = self::$page_size;
        $length = ceil($goods['stock'] / $page_size);
        $data = [];
        for ($i = 0; $i < $length; $i++) {
            $start_length = ($i * $page_size) + 1;
            $end_length = ($i * $page_size) + $page_size;
            if ($end_length >= $goods['stock']) {
                $end_length = $goods['stock'];
            }
            $data[] = [
                'title' => $start_length . '-' . $end_length,
                'page_no' => $i,
            ];
        }
        return $this->renderSuccess("请求成功", $data);
    }

    /**
     * 统计多少箱
     */
    public function goodslist_content(Request $request)
    {
        $sort = request()->param('sort/d', 0); #排序1箱号高 2余量高
        $goods_id = request()->param('goods_id/d', 0);
        $page_no = request()->param('page_no/d', 0); #页码
        if ($page_no <= 0) {
            $page_no = 0;
        }
        #盒子信息
        $goods = Goodsmodel::field('id,stock,status')
            ->where(['id' => $goods_id])
            ->find();
        if (!$goods) {
            return $this->renderError("盒子不存在");
        }
        if ($goods['status'] != 1 && $goods['status'] != 3) {
            return $this->renderError("盒子已下架");
        }
        $page_size = self::$page_size;
        $start_length = ($page_no * $page_size) + 1;
        $end_length = ($page_no * $page_size) + $page_size;
        if ($end_length >= $goods['stock']) {
            $end_length = $goods['stock'];
        }

        $data = [];
        for ($goods_num = $start_length; $goods_num <= $end_length; $goods_num++) {
            #奖品信息
            $goodlist = GoodsList::field('id,stock,surplus_stock,shang_id')
                ->append(['shang_title'])
                ->where(['goods_id' => $goods_id])
                ->where(['num' => $goods_num])
                ->order('money desc, sort desc,shang_id asc,id asc')
                ->select();
            #剩余
            $surplus_all_stock = 0;
            foreach ($goodlist as $key => $value) {
                if (!array_key_exists($value['shang_id'], self::$shang_give_arr)) {
                    $surplus_all_stock += $value['surplus_stock'];
                }
                unset($value['id']);
            }
            if ($surplus_all_stock <= 0) {
                $surplus_all_stock = 0;
            }
            $data[] = [
                'num' => $goods_num,
                'surplus_all_stock' => $surplus_all_stock,
                'goodslist' => $goodlist,
            ];
        }
        if ($sort == 2) {
            $data = arraySequence($data, 'surplus_all_stock');
        }
        return $this->renderSuccess("请求成功", $data);
    }

    /**
     * 中赏记录
     */
    public function shang_log(Request $request)
    {
        $shang_id = request()->param('shang_id/d', 0);
        $goods_id = request()->param('goods_id/d', 0);
        $goods_num = request()->param('goods_num/d', 0);
        #盒子信息
        $goods = Goodsmodel::field('id,stock,status,type')
            ->where(['id' => $goods_id])
            ->find();
        if (!$goods) {
            return $this->renderError("盒子不存在");
        }
        if ($goods['status'] != 1 && $goods['status'] != 3) {
            return $this->renderError("盒子已下架");
        }
        if (RegInt($goods_num)) {
            return $this->renderError("箱号选择错误");
        }
        #中奖记录分类
        $category = GoodsList::field('shang_id')
            ->append(['shang_title'])
            ->where('goods_id', '=', $goods_id)
            ->where('num', '=', $goods_num)
            ->group('shang_id')
            ->select()->toArray();
        array_unshift($category, ['shang_id' => 0, 'shang_title' => '全部']);
        $where = [];
        if ($shang_id) {
            $where[] = ['shang_id', '=', $shang_id];
        }
        $data = OrderList::field('user_id,goodslist_title,goodslist_imgurl,shang_id,luck_no,addtime,count(`id`) as prize_num')
            ->append(['shang_title', 'user_info'])
            ->where('goods_id', '=', $goods_id)
            ->where('num', '=', $goods_num)
            ->where('order_type', '=', $goods['type'])
            ->where('source', '=', 1)
            ->where($where)
            ->order('id desc')
            ->group("order_id,goodslist_id,user_id")
            ->paginate(10)->each(function ($item) {
                $item['user_info']['headimg'] = imageUrl($item['user_info']['headimg']);
                $item['addtime'] = date('Y-m-d H:i:s', $item['addtime']);
                $item['goodslist_imgurl'] = imageUrl($item['goodslist_imgurl']);
                return $item;
            });
        // dd($data);
        $new_data = [
            'category' => $category,
            'data' => $data->items(),
            'last_page' => $data->lastPage(),
        ];
        return $this->renderSuccess("请求成功", $new_data);
    }


    /**
     * 下单计算金额
     */
    public function ordermoney()
    {
        $user = $this->getUser();
        $prize_num = request()->param('prize_num/d', 0);             #抽几发
        $goods_id = request()->param('goods_id/d', 0);               #盒子ID
        $num = request()->param('goods_num/d', 0);                   #第几箱
        $use_money_is = request()->param('use_money_is/d', 0);       #0不抵扣 1抵扣
        $use_integral_is = request()->param('use_integral_is/d', 0); #0不抵扣 1抵扣
        $coupon_id = request()->param('coupon_id/d', 0);  //优惠券

        #盒子信息
        $goods = Goodsmodel::field('title,imgurl_detail,type,price,status,is_shou_zhe, max_num')->where(['id' => $goods_id])
            ->find();
        $where = [];
        $where[] = ['user_id', '=', $user['id']];
        $where[] = ['goods_id', '=', $goods_id];
        $order_count = OrderList::where($where)->field('id')->count('id');
        if ($goods['max_num'] > 0 and $order_count >= $goods['max_num']) {
            return $this->renderError("已达发数上限");
        }
        if (!$goods) {
            return $this->renderError("盒子不存在");
        }
        if ($goods['status'] != 1) {
            return $this->renderError("盒子已下架");
        }
        $goods['imgurl_detail'] = imageUrl($goods['imgurl_detail']);
        if (RegInt($num)) {
            return $this->renderError("箱号选择错误");
        }
        #奖品信息
        $goodslist = GoodsList::field('sum(`stock`) as stock, sum(`surplus_stock`) as surplus_stock')
            ->where('goods_id', '=', $goods_id)
            ->where('num', '=', $num)
            ->where('shang_id', 'between', self::$shang_prize_id)
            ->find();
        if (!$goodslist) {
            return $this->renderError('暂无奖品信息');
        }
        $surplus_stock = $goodslist['surplus_stock'];
        if ($surplus_stock <= 0) {
            return $this->renderError('库存剩余不足，请刷新重试');
        }
        #判断库存
        if (RegInt($prize_num)) {
            return $this->renderError("抽奖数量选择错误,请刷新重试");
        }
        if ($prize_num > $surplus_stock) {
            return $this->renderError("剩余数量不足，请刷新重试");
        }
        #盒子单价
        $box_price = $goods['price'];
        //是否首抽五折
        $shou_zhe_price = 0;
        if ($goods['type'] != 5) {
            // $is_chou = Order::field('id')->where([['user_id','=',$user['id']],['status','=',1]])->find();
            // $is_chou2 = Order::field('id')->where([['is_shou_zhe','=',1],['status','=',1],['user_id','=',$user['id']]])->find();
            // if (!$is_chou && !$is_chou2 && $goods['is_shou_zhe'] == 1){
            //     $shou_zhe_price = bcmul("$box_price", "0.5", 2);
            // }
        }
        $goods['shou_zhe_price'] = $shou_zhe_price;
        $price = bcmul("$box_price", "$prize_num", 2);
        $price = bcsub("$price", "$shou_zhe_price", 2);
        #订单金额 微信支付金额
        $order_total = $order_zhe_total = $price;
        #使用优惠券
        $coupon_price = 0;


        if ($shou_zhe_price <= 0 && !empty($coupon_id) && $goods['type'] != 5) {
            $coupon = CouponReceiveModel::where(['id' => $coupon_id, 'status' => 0, 'user_id' => $user['id']])->where('man_price', '<=', $price)->find();
            if ($coupon) {
                $coupon_price = $coupon['price'];
            }
        }


        $price = bcsub("$price", "$coupon_price", 2);
        if ($price <= 0) {
            $price = 0;
        }
        $order_zhe_total = $price;
        if ($goods['type'] == 1 || $goods['type'] == 3 || $goods['type'] == 6) {
            $zhe = 0;

            if ($shou_zhe_price <= 0) {
                $vip_info = UserVip::where(['id' => $user['vip']])->find();
                if ($vip_info && $vip_info['discount'] > 0) {
                    $zhe = $vip_info['discount'];
                    $zhe_bl = bcdiv("$zhe", "10", 2);
                    $order_zhe_total = $price = bcmul("$price", "$zhe_bl", 2);
                }
                #潮币抵扣
                $use_integral = 0;
                if ($use_integral_is == 1) {
                    $price = $price * 100;
                    if ($user['integral'] >= $price) {
                        $use_integral = $price;
                        $price = 0;
                    } else {
                        $use_integral = $user['integral'];
                        $price = bcsub("$price", "{$user['integral']}", 2);
                    }
                    $price = $price / 100;
                }
                #余额抵扣
                $use_money = 0;
                if ($use_money_is == 1) {
                    if ($user['money'] >= $price) {
                        $use_money = $price;
                        $price = 0;
                    } else {
                        $use_money = $user['money']; #
                        $price = bcsub("$price", "{$user['money']}", 2);
                    }
                }
            } else {
                $use_integral = 0;
                $use_money = 0;
            }

            $use_score = 0;
        } elseif ($goods['type'] == 5) {
            #折扣
            $zhe = 0;
            #微信支付
            $price = 0;
            #潮币抵扣
            $use_integral = 0;
            #余额抵扣
            $use_money = 0;
            #积分
            $use_score = $order_total;
        } else {
            return $this->renderError("非法请求");
        }
        #抽奖数量
        $goods['prize_num'] = $prize_num;
        $data = [
            'goods' => $goods,
            'order_total' => round(floatval($order_total), 2),
            'order_zhe_total' => round(floatval($order_zhe_total), 2),
            'zhe' => round(floatval($zhe), 2),
            'price' => round(floatval($price), 2),
            'integral' => round(intval($user['integral']), 2),
            'use_integral' => round(intval($use_integral), 2),
            'use_integral_money' => round(round(intval($use_integral), 2) / 100, 2),
            'money' => round(floatval($user['money']), 2),
            'use_money' => round(floatval($use_money), 2),
            'score' => $user['score'],
            'use_score' => $use_score,
            'coupon_price' => round(floatval($coupon_price), 2),
            'coupon_id' => $coupon_id
        ];
        return $this->renderSuccess("请求成功", $data);
    }


    /**
     * 下单计算
     */
    public function orderbuy()
    {
        $ad_id = request()->header('adid');
        $user = $this->getUser();
        if (empty($user['mobile'])) {
            return $this->renderError('请先绑定手机号', [], -9);
        }
        $prize_num = request()->param('prize_num/d', 0);             #抽几发
        $goods_id = request()->param('goods_id/d', 0);               #盒子ID
        $num = request()->param('goods_num/d', 0);                   #第几箱
        $use_money_is = request()->param('use_money_is/d', 0);       #0不抵扣 1抵扣
        $use_integral_is = request()->param('use_integral_is/d', 0); #0不抵扣 1抵扣
        $coupon_id = request()->param('coupon_id/d', 0);  //优惠券
        $pay_way = request()->param('pay_way');  //支付

        #盒子信息
        $goods = Goodsmodel::field('title,imgurl_detail,type,price,status,lock_is,lock_time,is_shou_zhe,pay_mode')->where(['id' => $goods_id])
            ->find();
        if (!$goods) {
            return $this->renderError("盒子不存在");
        }
        if ($goods['status'] != 1) {
            return $this->renderError("盒子已下架");
        }
        if (RegInt($num)) {
            return $this->renderError("箱号选择错误");
        }
        #奖品信息
        $is_goodslist = GoodsList::field('id')
            ->where('goods_id', '=', $goods_id)
            ->where('num', '=', $num)
            ->where('shang_id', 'between', self::$shang_prize_id)
            ->find();
        if (!$is_goodslist) {
            return $this->renderError('暂无奖品信息');
        }

        #锁箱信息===============
        if ($goods['type'] == 1 || $goods['type'] == 6) {
            $goods_id_num = $goods_id . '_' . $num;
            $lock_info = GoodsLock::where(['goods_id_num' => $goods_id_num])
                ->where('endtime', '>', time())
                ->order('id desc')
                ->find();
            if ($lock_info && $lock_info['endtime'] > time() && $lock_info['user_id'] !== $user['id']) {
                $surplus_time = $lock_info['endtime'] - time();
                return $this->renderError('有会员正在锁箱,请等待' . $surplus_time . '秒');
            }
            if ($goods['pay_mode'] == 2 && $use_money_is == 1) {
                return $this->renderError('该盒子仅支付微信支付');
            }
        }
        #锁箱信息===============

        #擂台赏限购===============
        if ($goods['type'] == 3) {
            $user_order_list = OrderList::field('id')
                ->where('goods_id', '=', $goods_id)
                ->where('user_id', $user['id'])
                ->where('num', '=', $num)
                ->where('order_type', '=', $goods['type'])
                ->where('shang_id', 'between', self::$shang_prize_id)
                ->find();
            if ($user_order_list) {
                return $this->renderError('限购一发');
            }
        }
        #擂台赏限购===============

        #奖品信息
        $goodslist = GoodsList::field('sum(`stock`) as stock, sum(`surplus_stock`) as surplus_stock')
            ->where('goods_id', '=', $goods_id)
            ->where('num', '=', $num)
            ->where('shang_id', 'between', self::$shang_prize_id)
            ->find();
        $surplus_stock = $goodslist['surplus_stock'];
        if ($surplus_stock <= 0) {
            return $this->renderError('库存剩余不足，请刷新重试');
        }
        #判断库存
        if (RegInt($prize_num)) {
            return $this->renderError("抽奖数量选择错误,请刷新重试");
        }
        if ($prize_num > $surplus_stock) {
            return $this->renderError("剩余数量不足，请刷新重试");
        }
        #盒子单价
        $box_price = $goods['price'];
        //是否首抽五折
        $shou_zhe_price = 0;
        $is_shou_zhe = 0;
        if ($goods['type'] != 5) {
            $is_chou = Order::field('id')->where([['user_id', '=', $user['id']], ['status', '=', 1]])->find();
            $is_chou2 = Order::field('id')->where([['is_shou_zhe', '=', 1], ['status', '=', 1], ['user_id', '=', $user['id']]])->find();
            if (!$is_chou && !$is_chou2 && $goods['is_shou_zhe'] == 1) {
                $shou_zhe_price = bcmul("$box_price", "0.5", 2);
            }
        }
        $goods['shou_zhe_price'] = $shou_zhe_price;
        $price = bcmul("$box_price", "$prize_num", 2);
        $price = bcsub("$price", "$shou_zhe_price", 2);
        #订单金额 微信支付金额
        $order_total = $order_zhe_total = $price;
        #使用优惠券
        $coupon_price = 0;
        if ($shou_zhe_price <= 0 && !empty($coupon_id) && $goods['type'] != 5) {
            $coupon = CouponReceiveModel::where(['id' => $coupon_id, 'status' => 0, 'user_id' => $user['id']])->where('man_price', '<=', $price)->find();
            if ($coupon) {
                $coupon_price = $coupon['price'];
            } else {
                $coupon_id = 0;
            }
        } else {
            $coupon_id = 0;
        }

        $price = bcsub("$price", "$coupon_price", 2);
        if ($price <= 0) {
            $price = 0;
        }
        $order_zhe_total = $price;
        if ($goods['type'] == 1 || $goods['type'] == 3 || $goods['type'] == 6) {
            #折扣
            $zhe = 0;

            if ($shou_zhe_price <= 0) {
                $vip_info = UserVip::where(['id' => $user['vip']])->find();
                if ($vip_info && $vip_info['discount'] > 0) {
                    $zhe = $vip_info['discount'];
                    $zhe_bl = bcdiv("$zhe", "10", 2);
                    $order_zhe_total = $price = bcmul("$price", "$zhe_bl", 2);
                }
                #潮币抵扣
                $use_integral = 0;
                if ($use_integral_is == 1) {
                    $price = $price * 100;
                    if ($user['integral'] >= $price) {
                        $use_integral = $price;
                        $price = 0;
                    } else {
                        $use_integral = $user['integral'];
                        $price = bcsub("$price", "{$user['integral']}", 2);
                    }
                    $price = $price / 100;
                }
                #余额抵扣
                $use_money = 0;
                if ($use_money_is == 1) {
                    if ($user['money'] >= $price) {
                        $use_money = $price;
                        $price = 0;
                    } else {
                        $use_money = $user['money']; #
                        $price = bcsub("$price", "{$user['money']}", 2);
                    }
                }
            } else {
                $use_integral = 0;
                $use_money = 0;
            }


            $use_score = 0;
        } elseif ($goods['type'] == 5) {
            #折扣
            $zhe = 0;
            #微信支付
            $price = 0;
            #潮币抵扣
            $use_integral = 0;
            #余额抵扣
            $use_money = 0;
            #积分
            $use_score = $order_total;
            if ($user['score'] < $use_score) {
                return $this->renderError("积分不足");
            }
        } else {
            return $this->renderError("非法请求");
        }

        #一番赏锁箱
        if ($goods['type'] == 1 || $goods['type'] == 6) {
            #盒子id_箱号
            $goods_id_num = $goods_id . '_' . $num;
            #盒子是否配置锁箱
            if ($goods['lock_is'] == 1 && $goods['lock_time'] > 0) {
                $redis = new \Redis();
                $redis->connect('127.0.0.1', 6379);
                $redis_key = "kpw_lock" . '_' . $goods_id_num;
                $redis_key_info = $redis->get($redis_key);
                if ($redis_key_info) {
                    return $this->renderError("有会员正在锁箱,请等待");
                } else {
                    $redis->set($redis_key, 1, 1);
                }
                #默认锁箱时间
                $defaulttime = (time() + $goods['lock_time']);
                #锁箱信息
                $lock_info = GoodsLock::where('goods_id_num', '=', $goods_id_num)
                    ->where('endtime', '>', time())
                    ->order('id desc')
                    ->find();
                if ($lock_info) { #存在锁箱
                    if ($prize_num == 3 || $prize_num == 5 || $prize_num == 10 || $prize_num == 50) {
                        $config_time = getConfig('base');
                        if ($prize_num == 3) {
                            $endtime = $defaulttime + $config_time['three_time'];
                        } elseif ($prize_num == 5) {
                            $endtime = $defaulttime + $config_time['five_time'];
                        } elseif ($prize_num == 10) {
                            $endtime = $defaulttime + $config_time['ten_time'];
                        } elseif ($prize_num == 50) {
                            $endtime = $defaulttime + $config_time['fifty_time'];
                        }
                        GoodsLock::where('id', '=', $lock_info['id'])
                            ->update([
                                'endtime' => $endtime,
                                'update_time' => time(),
                            ]);
                    } else {
                        GoodsLock::where('id', '=', $lock_info['id'])
                            ->update([
                                'endtime' => $defaulttime,
                                'update_time' => time(),
                            ]);
                    }
                } else {
                    if ($prize_num == 3 || $prize_num == 5 || $prize_num == 10 || $prize_num == 50) {
                        $config_time = getConfig('base');
                        if ($prize_num == 3) {
                            $endtime = $defaulttime + $config_time['three_time'];
                        } elseif ($prize_num == 5) {
                            $endtime = $defaulttime + $config_time['five_time'];
                        } elseif ($prize_num == 10) {
                            $endtime = $defaulttime + $config_time['ten_time'];
                        } elseif ($prize_num == 50) {
                            $endtime = $defaulttime + $config_time['fifty_time'];
                        }
                        #新增锁箱信息
                        GoodsLock::insert([
                            'user_id' => $user['id'],
                            'goods_id_num' => $goods_id_num,
                            'endtime' => $endtime,
                            'update_time' => time(),
                        ]);
                    } else {
                        #新增锁箱信息
                        GoodsLock::insert([
                            'user_id' => $user['id'],
                            'goods_id_num' => $goods_id_num,
                            'endtime' => $defaulttime,
                            'update_time' => time(),
                        ]);
                    }
                }
            }
        }
        #一番赏锁箱

        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis_key = "kpw_orderbuy" . '_' . $user['id'];
        $redis_key_info = $redis->get($redis_key);
        if ($redis_key_info) {
            return $this->renderError("当前操作太快了,请等待");
        } else {
            $redis->set($redis_key, 1, 2);
        }

        Db::startTrans();
        #===================================================***********
        #奖品信息加锁
        GoodsList::field('id,stock,surplus_stock')
            ->where('goods_id', '=', $goods_id)
            ->where('num', '=', $num)
            ->lock(true)->select();
        #奖品信息
        $goodslist_lock = GoodsList::field('sum(`surplus_stock`) as surplus_stock')
            ->where('goods_id', '=', $goods_id)
            ->where('num', '=', $num)
            ->where('shang_id', 'between', self::$shang_prize_id)
            ->find();
        #判断库存
        if ($goodslist_lock['surplus_stock'] <= 0) {
            Db::rollback();
            $redis->del($redis_key);
            return $this->renderError("已售空，请刷新重试");
        }
        #===================================================***********


        $res = [];
        $order_num = create_order_no('MH_', 'order', 'order_num');
        #创建订单
        $res[] = $order_id = Order::insertGetId([
            'user_id' => $user['id'],
            'order_num' => $order_num,
            'order_total' => $order_total, #订单金额
            'order_zhe_total' => $order_zhe_total, #订单折扣金额
            'price' => $price, #微信支付
            'use_money' => $use_money, #余额抵扣
            'use_integral' => $use_integral, #潮币抵扣
            'use_score' => $use_score, #积分抵扣
            'zhe' => $zhe, #会员折扣
            'goods_id' => $goods_id,
            'num' => $num,
            'goods_price' => $goods['price'],
            'goods_title' => $goods['title'],
            'goods_imgurl' => $goods['imgurl_detail'],
            'prize_num' => $prize_num,
            'status' => 0,
            'pay_type' => $pay_way == 'ali_wap' ? 2 : 1, #1微信 2支付宝
            'order_type' => $goods['type'],
            'addtime' => time(),
            'coupon_id' => $coupon_id ? $coupon_id : 0,
            'use_coupon' => $coupon_price, #优惠券抵扣
            'is_shou_zhe' => $is_shou_zhe,
            'ad_id' => $ad_id,
            'click_id' => $user['click_id']
        ]);
        #微信支付金额大于0
        if ($price > 0) {
            $body = '购买盒子' . $goods['title'];
            if ($goods['type'] == 1) {
                $attach = 'order_yfs';
            } elseif ($goods['type'] == 3) {
                $attach = 'order_lts';
            } elseif ($goods['type'] == 6) {
                $attach = 'order_lts';
            }
            if ($pay_way == 'ali_wap') {
                $payRes = (new Pay())->zfpay($order_num, $price, $body, $attach . ',' . $user['openid']);
            } else {
                $payRes = (new Pay())->wxCreateOrder($order_num, $price, $user['openid'], $body, $attach);
            }

            if ($payRes['status'] == 1) {
                #结果集
                $new_data = [
                    'status' => 1,
                    'order_num' => $order_num,
                    'res' => $payRes['data'],
                ];
            } else {
                Db::rollback();
                #删除redis
                $redis->del($redis_key);
                return $this->renderError($payRes);
                // return $this->renderError("下单失败");
            }
        } else {
            try {
                #开盒子
                $res[] = (new Notify($this->app))->drawprize_notice($user['id'], $order_id, $goods_id, $num);
            } catch (\Throwable $e) {
                Db::rollback();
                #删除redis
                $redis->del($redis_key);
                // $this->renderError($e->getMessage());
                return $this->renderError('火爆下单中，请刷新后重试');
            }
            #结果集
            $new_data = [
                'status' => 0,
                'order_num' => $order_num,
            ];
        }
        if (resCheck($res)) {
            Db::commit();
            #删除redis
            $redis->del($redis_key);
            return $this->renderSuccess("下单成功", $new_data);
        } else {
            Db::rollback();
            #删除redis
            $redis->del($redis_key);
            return $this->renderError("购买失败,请刷新重试");
        }
    }


    /**
     * 抽中的奖品
     */
    public function prizeorderlog()
    {
        $user = $this->getUser();
        $order_num = request()->param('order_num', '');
        $order_info = Order::field('id,goods_id,num,order_type')
            ->where('order_num', '=', $order_num)
            ->where('user_id', '=', $user['id'])
            ->find();
        if (!$order_info) {
            return $this->renderError("支付异常,请刷新重试");
        }
        #普通赏
        $data = OrderList::field('id,user_id,shang_id,goodslist_id,goodslist_title,goodslist_imgurl,goodslist_money,count(id) as prize_num')
            ->append(['shang_title'])
            ->where('user_id', '=', $user['id'])
            ->where('order_id', '=', $order_info['id'])
            ->where('order_type', '=', $order_info['order_type'])
            ->order('shang_id asc, id asc')
            ->group('prize_code')
            ->paginate(100)->each(function ($item) {
                $item['goodslist_imgurl'] = imageUrl($item['goodslist_imgurl']);
                return $item;
            });

        //重抽卡数量
        $item_card_count = Db::name('user_item_card')->where(['user_id' => $user['id'], 'status' => 1])->count();

        $new_data = [
            'data' => $data->items(),
            'item_card_count' => $item_card_count,
        ];
        return $this->renderSuccess("请求成功", $new_data);
    }


    /**
     * 收藏列表
     */
    public function listCollect(Request $request)
    {
        //1一番赏 2无限赏 3擂台赏 4抽卡机 5积分赏 6全局赏 7福利盲盒  8领主赏  9连击赏
        $user = $this->getUser();
        $type = \request()->param('type', 0);
        $data = Collect::field('id,goods_id,type,num')
            ->where(['user_id' => $user['id']])
            ->where('type', '=', $type)
            ->append(['goods_info'])
            ->paginate(100)->each(function ($item) {

                $item['goods_title'] = $item['goods_info']['title'];
                $item['goods_price'] = $item['goods_info']['price'];
                $item['imgurl'] = imageUrl($item['goods_info']['imgurl']);
                if (in_array($item['type'], [1, 3, 5, 6])) {
                    #库存
                    $surplus = GoodsList::field('sum(`stock`) as stock, sum(`surplus_stock`) as surplus_stock')
                        ->where('goods_id', '=', $item['goods_id'])
                        ->where('num', '=', $item['num'])
                        ->where('shang_id', 'between', self::$shang_prize_id)
                        ->find();
                    $item['stock'] = $surplus['stock'];
                    $item['surplus_stock'] = $surplus['surplus_stock'];
                } else {
                    $item['stock'] = 0;
                    $item['surplus_stock'] = 0;
                }
                return $item;
            });
        $new_data = [
            'data' => $data->items(),
            'last_page' => $data->lastPage(),
        ];
        return $this->renderSuccess("操作成功", $new_data);
    }

    /**
     * 添加收藏
     */
    public function addCollect(Request $request)
    {
        $user = $this->getUser();
        $goods_id = request()->param('goods_id/d', 0);
        $goods_num = request()->param('goods_num/d', 0);
        #盒子信息
        $goods = Goodsmodel::field('id,stock,status,type')
            ->where(['id' => $goods_id])
            ->find();
        if (!$goods) {
            return $this->renderError("盒子不存在");
        }
        if ($goods['status'] != 1 && $goods['status'] != 3) {
            return $this->renderError("盒子已下架");
        }
        $info = Collect::field('id')
            ->where(['user_id' => $user['id']])
            ->where(['goods_id' => $goods_id])
            ->where(['num' => $goods_num])
            ->find();
        if ($info) {
            $res = Collect::where(['id' => $info['id']])->delete();
        } else {
            $res = Collect::insert([
                'user_id' => $user['id'],
                'goods_id' => $goods_id,
                'num' => $goods_num,
                'type' => $goods['type'],
                'addtime' => time(),
            ]);
        }
        if ($res) {
            return $this->renderSuccess("操作成功");
        } else {
            return $this->renderError("操作失败");
        }
    }

    /**
     * 删除收藏
     */
    public function delCollect(Request $request)
    {
        $user = $this->getUser();
        $id = request()->param('id/d', 0);
        $info = Collect::field('id')
            ->where(['user_id' => $user['id']])
            ->where(['id' => $id])
            ->find();
        if (!$info) {
            return $this->renderError("请求重复操作");
        }
        $res = Collect::where(['id' => $info['id']])->delete();
        if ($res) {
            return $this->renderSuccess("删除成功");
        } else {
            return $this->renderError("删除失败");
        }
    }

    /**
     * 抽奖统计
     * @param Request $request
     *created by Admin at 2022/12/21 11:14
     */
    public function luck_draw_log(Request $request)
    {
        $id = $request->param('id');
        $goods = Goodsmodel::where('id', $id)->find();
        if (!$goods) {
            return $this->renderError("盒子不存在");
        }
        $user_ids = OrderList::field('user_id')
            ->append(['userinfo'])
            ->where('goods_id', $goods['id'])
            ->where('source', '=', 1)
            ->group('user_id')
            ->paginate(20);
        foreach ($user_ids as $value) {
            $count = OrderList::field('user_id')
                ->where('goods_id', $goods['id'])
                ->where('user_id', $value['user_id'])
                ->count();
            $value['count'] = $count;
        }
        return $this->renderSuccess("操作成功", $user_ids);
    }

    /**
     * 领取兑换码
     */
    public function  receive_convert_code()
    {
        $user = $this->getUser();
        $code = request()->param('code/s', 0);

        $whe = [];
        $whe[] = ['code', '=', $code];
        $code_info = ConvertCode::getInfo($whe);
        if (empty($code_info)) {
            return $this->renderError("兑换码错误");
        }
        if ($code_info['status'] > 0) {
            return $this->renderError("兑换码已领完");
        }
        $whe = [];
        $whe[] = ['user_id', '=', $user['id']];
        $whe[] = ['convert_code_id', '=', $code_info['id']];
        $check_receive = ConvertCodeReceive::where($whe)->find();
        if (!empty($check_receive)) {
            return $this->renderError("已领取兑换码奖励");
        }

        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis_key = "receive_code" . '_' . $user['id'];
        $redis_key_info = $redis->get($redis_key);
        if ($redis_key_info) {
            return $this->renderError("当前操作太快了,请等待");
        } else {
            $redis->set($redis_key, 1, 2);
        }
        $order_num = ConvertCodeReceive::where(['convert_code_id' => $code_info['id']])->order('id desc')->value('order_num') ?? 0;
        //记录
        Db::startTrans();
        $add = [];
        $add['convert_code_id'] = $code_info['id'];
        $add['user_id'] = $user['id'];
        $add['code'] = $code;
        $add['coupon_id'] = $code_info['coupon_id'];
        $add['goodslist_id'] = $code_info['goodslist_id'];
        $add['order_num'] = $order_num;
        $add['addtime'] = time();
        $res = ConvertCodeReceive::insert($add);

        //优惠券
        $coupon_info = CouponModel::getInfo(['id' => $code_info['coupon_id']]);
        $ress = 1;
        if (!empty($coupon_info)) {
            $coupon = [];
            $coupon['user_id'] = $user['id'];
            $coupon['title']    = $coupon_info['title'];
            $coupon['price']  = $coupon_info['price'];
            $coupon['man_price'] = $coupon_info['man_price'];
            $coupon['end_time'] = $coupon_info['effective_day'] * 86400 + time();
            $coupon['addtime'] = time();
            $coupon['coupon_id'] = $coupon_info['id'];
            $coupon['state'] = $coupon_info['ttype'];
            $ress = CouponReceiveModel::insert($coupon);
        } else {
            $coupon_info = [];
        }
        //商品
        $special_prize = GoodsList::getInfo(['id' => $code_info['goodslist_id']]);
        $resss = 1;
        if (!empty($special_prize)) {
            $order_goods = [
                'order_id' => 0,
                'user_id' => $user['id'],
                'status' => 0, #0未操作 1选择兑换 2选择发货
                'goods_id' => '-5',
                'goodslist_id' => $special_prize['id'],
                'goodslist_title' => $special_prize['title'],
                'goodslist_imgurl' => $special_prize['imgurl'],
                'goodslist_price' => $special_prize['price'],
                'goodslist_money' => $special_prize['money'],
                'addtime' => time(),
            ];
            $resss = OrderList::insert($order_goods);
        } else {
            $special_prize = [];
        }

        $ret = ConvertCode::where(['id' => $code_info['id']])->inc('yet_num')->update();

        $codes = ConvertCode::where(['id' => $code_info['id']])->find();
        $sss = 1;
        if ($codes['num'] > 0) {
            if ($codes['num'] <= $codes['yet_num']) {
                $sss = ConvertCode::where(['id' => $code_info['id']])->update(['status' => 1]);
            }
        }

        if ($res and $ress and $resss and $ret and $sss) {
            Db::commit();
            $redis->del($redis_key);
            $data['coupon'] = $coupon_info;
            $special_prize['imgurl'] = '';
            if (!empty($special_prize)) {
                $special_prize['imgurl'] = imageUrl($special_prize['imgurl']);
            }

            $data['goodslist'] = $special_prize;

            return $this->renderSuccess("领取成功", $data);
        }
        Db::rollback();
        $redis->del($redis_key);
        return $this->renderError("网络链接不畅，请重试");
    }

    /**
     * 冲锋赏排行
     */
    public function shang_order_ranks(Request $request)
    {
        $goods_id = $request->param('goods_id');
        $num = $request->param('num', '');
        if (empty($goods_id)) {
            return $this->renderError("缺少参数：goods_id");
        }
        if (empty($num)) {
            return $this->renderError("缺少参数：num");
        }

        $whee = [];
        $whee[] = ['id', 'between', self::$shang_prize_id];
        $shang_info = Shang::getAllList($whee, 'id, title');
        $shang_info = array_column($shang_info->toArray(), null, 'id');
        $where = [];
        $where[] = ['goods_id', '=', $goods_id];
        $where[] = ['num', '=', $num];
        $field = 'user_id, count(`id`) count_num';
        $ranks = OrderList::where($where)->field($field)->group('user_id')->order('count_num desc')->paginate(['list_rows' => 100, 'query' => request()->param()]);
        $data['list'] = $ranks->toArray()['data'];
        foreach ($data['list'] as $k => &$v) {
            $user_info = User::getInfo(['id' => $v['user_id']], 'id,nickname, headimg');
            $v['nickname'] = $user_info['nickname'];
            $v['headimg'] = imageUrl($user_info['headimg']);
            $v['rank_num'] = $k + 1;
            $where = [];
            $where[] = ['user_id', '=', $v['user_id']];
            $where[] = ['goods_id', '=', $goods_id];
            $where[] = ['num', '=', $num];
            $field = 'shang_id, count(`id`) shang_num';
            $shang_nums = OrderList::where($where)->group('shang_id')->field($field)->select()->toArray();
            foreach ($shang_nums as &$nums) {
                $nums['shang_title'] = $shang_info[$nums['shang_id']]['title'];
            }
            $v['shang_nums_info'] = $shang_nums;
        }
        $page = $ranks->render();
        $data['count'] = $ranks->total();
        $data['last_page'] = $ranks->toArray()['last_page'];
        $data['page'] = $page;
        return $this->renderSuccess("获取成功", $data);
    }
}
